package com.fz.us.admin.company.service;


import com.fz.us.admin.base.bean.Result;
import com.fz.us.admin.base.service.BaseService;
import com.fz.us.admin.company.bean.EnumManage;
import com.fz.us.admin.company.entity.Admin;
import com.fz.us.admin.company.entity.Company;
import com.fz.us.admin.company.entity.User;

import java.util.Date;

/**
 * Service接口 - 管理员
 * ============================================================================
 * 版权所有 2016 。
 *
 * @author fallenpanda
 * @version 1.0 2016-07-25 。
 * ============================================================================
 */
public interface AdminService extends BaseService<Admin, String> {

    /**
     * 判断用户名是否存在（不区分大小写）
     *
     * @param username
     *
     * @return
     */
    public boolean isExistByUsername(String username);

    /**
     * 判断手机号是否存在（不区分大小写）
     *
     * @param usermobile
     *
     * @return
     */
    public boolean isExistByUsermobile(String usermobile);

    /**
     * 判断邮箱是否存在（不区分大小写）
     *
     * @param useremail
     *
     * @return
     */
    public boolean isExistByUseremail(String useremail);

    /**
     * 根据账号获取 Admin 对象，若不存在，则返回null（区分大小写）
     *
     * @param account username|usermobile|useremail
     *
     * @return
     */
    public Admin getAdminByAccount(String account);

    /**
     * 判断openId是否存在（不区分大小写）
     *
     * @param openId
     *
     * @return
     */
    public boolean isExistByOpenId(String openId);

    /**
     * 根据 openId 获取 Admin 对象，若不存在，则返回null（区分大小写）
     *
     * @param openId
     *
     * @return
     */
    public Admin getAdminByOpenId(String openId);

    /**
     * 根据 openId 获取 Admin 对象，若不存在，则返回null（区分大小写）
     *
     * @param openId
     *
     * @return
     */
    public Admin getWeixinAdminByLastOpenId(String openId);

    /**
     * 检查用户名是否有效
     *
     * @param accountEnum
     * @param username
     *
     * @return
     */
    public Result checkUsername(EnumManage.AccountEnum accountEnum, String username);

    /**
     * 创建 Admin 对象
     *
     * @param accountEnum
     * @param username
     * @param password
     * @param isEnabled 账号是否已验证
     *
     * @return
     */
    public Admin createAdmin(EnumManage.AccountEnum accountEnum,  EnumManage.AccountTypeEnum accountTypeEnum, String username, String password, boolean isEnabled);
    public Admin createAdmin(EnumManage.AccountEnum accountEnum,  EnumManage.AccountTypeEnum accountTypeEnum, String username, String password);

    /**
     * 创建 Admin
     *
     * @param openId
     *
     * @return
     */
    public Admin createAdmin(String openId);

    /**
     * 设置有效期
     *
     * @param admin
     * @param expireDate
     *
     * @return
     */
    public void setExpiredDate(Admin admin, Date expireDate);

    /**
     * 加密密码
     *
     * @param uid
     * @param password
     * @param salt
     * @return
     */
    public String encodedPassword(String uid, String password, String salt);

    /**
     * 验证密码
     *
     * @param admin
     * @param password
     *
     * @return
     */
    public boolean validPassword(Admin admin, String password);

    /**
     * 修改密码
     *
     * @param admin
     * @param password
     *
     * @return
     */
    public Result updatePassword(Admin admin, String password);

    /**
     * 修改用户名
     *
     * @param admin
     * @param username
     *
     * @return
     */
    public Result updateUsername(Admin admin, String username);

    /**
     * 启用手机号
     *
     * @param admin
     * @return
     */
    public Result enableUsermobile(Admin admin);

    /**
     * 禁用手机号
     *
     * @param admin
     * @return
     */
    public Result disableUsermobile(Admin admin);

    /**
     * 修改手机号
     *
     * @param admin
     * @param mobile
     * @return
     */
    public Result updateUsermobile(Admin admin, String mobile);

    /**
     * 启用邮箱
     *
     * @param admin
     * @return
     */
    public Result enableUseremail(Admin admin);

    /**
     * 修改邮箱
     *
     * @param admin
     * @param email
     * @return
     */
    public Result updateUseremail(Admin admin, String email);

    /**
     * 修改 OpenId
     *
     * @param admin
     * @param openId
     * @return
     */
    public Result updateOpenId(Admin admin, String openId);

    /**
     * 设置 OpenId
     *
     * @param admin
     * @return
     */
    public void setOpenId(Admin admin, String openId);

    /**
     * 清除 OpenId
     *
     * @param admin
     * @return
     */
    public void clearOpenId(Admin admin);

    /**
     * 获得管理员所在公司id
     * @return
     */
    public Company getCompanyByAdminType();

    /**
     * 重置密码
     * @param admin
     * @param password
     * @throws Exception
     */
    public void ResetPass(Admin admin, String password);


}
